package com.zzz.common.redis.config;

import com.alibaba.fastjson2.JSON;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;

import java.nio.charset.Charset;

/**
 * @BelongsProject: oj-project
 * @BelongsPackage: com.zzz.common.redis.config
 * @Author: zhai
 * @CreateTime: 2025-09-23  11:34
 * @Description: TODO 自定义Redis的JSON序列化器
 * @Version: 1.0
 */
public class JsonRedisSerializer<T> implements RedisSerializer<T> {
    public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");

    private Class<T> clazz;


    /**
     * TODO: 构造函数，初始化JsonRedisSerializer实例
     * @param clazz 需要序列化/反序列化的对象类型Class
     */
    public JsonRedisSerializer(Class<T> clazz) {
        super();
        this.clazz = clazz;
    }

    /**
     * TODO: 将对象序列化为字节数组
     * @param t 需要序列化的对象，可以为null
     * @return 序列化后的字节数组，如果对象为null则返回空字节数组
     * @throws SerializationException 序列化过程中发生的异常
     */
    @Override
    public byte[] serialize(T t) throws SerializationException {
        if (t == null) {
            return new byte[0];
        }
        return JSON.toJSONString(t).getBytes(DEFAULT_CHARSET);
    }

    /**
     * TODO: 将字节数组反序列化为对象
     * @param bytes 需要反序列化的字节数组，可以为null或空数组
     * @return 反序列化后的对象，如果字节数组为null或空则返回null
     * @throws SerializationException 反序列化过程中发生的异常
     */
    @Override
    public T deserialize(byte[] bytes) throws SerializationException {
        if (bytes == null || bytes.length <= 0) {
            return null;
        }
        String str = new String(bytes, DEFAULT_CHARSET);

        return JSON.parseObject(str, clazz);
    }
}

